home *** CD-ROM | disk | FTP | other *** search
-
- ;=======VECTOR STRUCTURE
- VECTOR STRUC
- REGIP DW ?
- REGCS DW ?
- VECTOR ENDS
- ;=======DATA SEGMENT
- DATA SEGMENT PUBLIC 'DATA'
- CLKDIV DW ? ;<- USER PROVIDED DIVISOR
- PUBLIC CLKDIV
- ; ACTUAL DIVISOR ...
- CLKDIVH DW ? ;...(HIGH WORD)
- CLKDIVL DW ? ;...(LOW WORD)
- CLKMOD DW ? ; DIVISOR MODULUS
- ; USER-PROVIDED NEAR PROCEDURE
- CLKRTN DW ?
- PUBLIC CLKRTN
- INT08 VECTOR <> ;INTERCEPTED INT 008H VECTOR
- DATA ENDS
- ;=======STACK SEGMENT
- STACK SEGMENT STACK 'STACK'
- STACK ENDS
- ;=======CODE SEGMENT
- CODE SEGMENT PUBLIC 'CODE'
- ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK
- EXTRN SEGCODE:WORD ;<- CODE SEGMENT
- EXTRN SEGDATA:WORD ;<- DATA SEGMENT
- ;*******CLKRATE CLOCK RATE SETTING ROUTINE
- CLKRATE PROC NEAR
- ;-------LOAD COUNTER 0 OF THE 8259
- PUSH AX
- MOV AL,00110110B
- OUT 043H,AL
- POP AX
- OUT 040H,AL
- XCHG AH,AL
- OUT 040H,AL
- XCHG AH,AL
- RET
- CLKRATE ENDP
- ;*******CLKPRO CLOCK PROLOGUE
- CLKPRO PROC NEAR
- PUBLIC CLKPRO
- PUSH AX
- PUSH DX
- ;-------INITIALIZE CLK VARIABLES
- XOR AX,AX
- CALL CLKRATE
- MOV CLKDIV,AX
- MOV CLKDIVH,1
- MOV CLKDIVL,AX
- MOV CLKMOD,AX
- MOV CLKRTN,OFFSET CLKNUL
- ;-------SAVE CURRENT INTERRUPT VECTOR
- PUSH ES
- MOV AH,035H
- MOV AL,008H
- INT 021H
- ASSUME ES:NOTHING
- MOV INT08.REGIP,BX
- MOV INT08.REGCS,ES
- POP ES
- ASSUME ES:DATA
- ;-------INSTALL INTERRUPT INTERCEPT VECTOR
- PUSH DS
- MOV AH,025H
- MOV AL,008H
- MOV DX,OFFSET CLKINT
- MOV DS,SEGCODE
- ASSUME DS:CODE
- INT 021H
- POP DS
- ASSUME DS:DATA
- POP DX
- POP AX
- RET
- CLKPRO ENDP
- ;*******CLKEPI CLOCK EPILOGUE
- CLKEPI PROC NEAR
- PUBLIC CLKEPI
- PUSH AX
- PUSH DX
- ;-------RESET CLOCK DIVISOR TO 65536
- XOR AX,AX
- CALL CLKRATE
- ;-------RESET INTERRUPT VECTOR
- PUSH DS
- MOV AH,025H
- MOV AL,008H
- LDS DX,INT08
- ASSUME DS:NOTHING
- INT 021H
- POP DS
- ASSUME DS:DATA
- POP DX
- POP AX
- RET
- CLKEPI ENDP
- ;*******INTERRUPT ROUTINES
- ASSUME CS:CODE,DS:NOTHING,ES:NOTHING
- ASSUME SS:NOTHING
- ;*******CLKINT CLOCK INTERRUPT INTERCEPT ROUTINE
- CLKINT PROC FAR
- PUSH AX
- PUSH DS
- PUSH ES
- ;-------ESTABLISH ADDRESSABILITY
- MOV DS,SEGDATA
- ASSUME DS:DATA
- MOV ES,SEGDATA
- ASSUME ES:DATA
- ;-------DO USER ROUTINE.
- CALL CLKRTN
- ;-------CHECK FOR ROLL-OVER OF 65536 CYCLES
- MOV AX,CLKDIVL
- ADD CLKMOD,AX
- MOV AX,CLKDIVH
- ADC AX,0
- JNZ CLKINT8
- ;-------NOT TIME YET, SKIP ORIGINAL INTERRUPT
- MOV AL,00100000B
- OUT 020H,AL
- JMP CLKINT7
- ;-------DO THE ORIGINAL INTERRUPT.
- CLKINT8 LABEL NEAR
- PUSHF
- CALL INT08
- CLKINT7 LABEL NEAR
- ;-------CHANGE DIVISOR IF SO REQUESTED
- MOV AX,CLKDIV
- CMP AX,CLKDIVL
- JE CLKINTX
- CALL CLKRATE
- MOV CLKDIVL,AX
- CMP AX,1
- MOV CLKDIVH,0
- ADC CLKDIVH,0
- CLKINTX LABEL NEAR
- POP ES
- ASSUME ES:NOTHING
- POP DS
- ASSUME DS:NOTHING
- POP AX
- IRET
- CLKINT ENDP
- ;*******CLKNUL INITIAL USER PROVIDED ROUTINE
- CLKNUL PROC NEAR
- RET
- CLKNUL ENDP
- CODE ENDS
- END
-